package no.sachmuld.methodcombination.examples.annotation.combo.foo;

import no.sachmuld.methodcombination.api.CrosscuttingBehaviour;
import no.sachmuld.methodcombination.api.MethodCombinationSupport;
import no.sachmuld.methodcombination.api.annotation.*;
import no.sachmuld.methodcombination.examples.annotation.combo.ContractChecking;
import no.sachmuld.methodcombination.examples.annotation.combo.SimpleCrosscutting;
import no.sachmuld.methodcombination.examples.annotation.combo.StandardCrosscutting;

/**
 *
 */
@UsesMethodCombination(FooBehaviour.class)
public abstract class Foo extends MethodCombinationSupport<CrosscuttingBehaviour> {

    @StandardCrosscutting
    final public String bar(int i) {
        throw new MethodCombinationException();
    }

    @StandardCrosscutting
    final public String baz(int i) {
        throw new MethodCombinationException();
    }

    @SimpleCrosscutting @Or
    final public boolean or() {
        throw new MethodCombinationException();
    }

    @ContractChecking @SimpleCrosscutting @Min
    final public int min() {
        throw new MethodCombinationException();
    }

    @Override
    public Foo with(CrosscuttingBehaviour... behaviours) {
        super.with(behaviours);
        return this;
    }

}
